#include "stm32f10x.h"
#include <stdint.h>

// PWM极性
// 先说好，双极性只是在这里占位，程序目前并没有支持
typedef enum {
  PWM_Unipolar = 0, // 单极性，占空比在-100到100之间
  PWM_Bipolar = 1   // 双极性，占空比在0到100之间
} PWM_Type;

typedef struct {
  uint32_t freq;
  volatile int16_t duty_pct;
  PWM_Type type;
  TIM_TypeDef *timer;
  GPIO_TypeDef *port[2];
  uint16_t pin[2];
  // private:
  uint16_t _TIMReloadCount; // 计数器置数中断多少次完成一个PWM周期
  volatile uint16_t _currentCount; // 当前置数中断多少次
  volatile uint16_t _pulseWidth;   // 当前PWM脉宽

} PWM;

PWM *new_PWM(void);
void delete_PWM(PWM *this);

void PWM_Init(PWM *this);
void PWM_Config(PWM *this, uint32_t freq, PWM_Type type, TIM_TypeDef *timer,
                GPIO_TypeDef *posPort, GPIO_TypeDef *negPort, uint16_t posPin,
                uint16_t negPin);
void PWM_SetDuty(PWM *this, int16_t duty_pct);
void PWM_Step(PWM *this);